昨天文末時 , 請 邦友 設定的 3 項屬性不知道各位做出來了嗎 ?
如果沒有 , 可以到 neuomorphic-button-05.js 這裡來參考作法 ![]()
如果 邦友 有其他作法 , 歡迎大家到昨天的留言區 , 留言分享您的作法 ![]()
基礎的 HTML 按鈕 上有一個 onclick 事件 , 用來設定點擊後 , 要觸發哪一個函式
我們做的 neuomorphic-button 也是一個按鈕 , 當然我們需要有一個 點擊事件 , 讓引用元件的人 , 能註冊點擊後的處理函式
下面 , 我們就將 點擊事件 , 追加到 neuomorphic-button 元件上吧 !
開始實作之前 , 我們來確認一下 , 在頁面中工程師常用那些手法設定 "click" 事件呢 ?
<button> 的 onclick 屬性<button onclick="clickHandler()" />
button.addEventListener('click', clickHandler )
也就是今天完成時 , 上方的 2 種事件 都可以在 neuomorphic-button 元件上使用
 將昨天的進度取出
class NeuomorphicButton extends HTMLElement {
  constructor() {
    super();
    const fontAwesomeStyle = `<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css">`
    // neumorphism 產生器 : https://neumorphism.io/#e0e0e0
    const styleStr = `[neumorphism 按鈕樣式]`;
    const icon = this.getAttribute('icon') || 'fas fa-wifi'
    const size = this.getAttribute('size') || 70
    const color = this.getAttribute('color') || '#6a9bd8'
    const bgColor = this.getAttribute('bg-color') || '#ebf5fc'
    const htmlStr = `
        <label>
          <input type="checkbox" name="">
          <div class="icon-box" style="width: ${size}px;height: ${size}px;background-color:${bgColor}">
              <i class="${icon}" style="font-size: ${size * 0.6}px;color:${color}"></i>
          </div>
        </label>
    `
    this.attachShadow({mode: 'open'}).innerHTML = fontAwesomeStyle + styleStr + htmlStr
  }
}
window.customElements.define('neuomorphic-button', NeuomorphicButton);
 在 checkbox 加上 addEventListener 監聽 checkbox 的變化
const checkbox = label.querySelector('input[type="checkbox"]')
checkbox.addEventListener('change', function (e) {
  console.log('checkbox 被點到')
});
 產生一個新的 Event 並將其 dispatch 到元素上
const self = this
const checkbox = label.querySelector('input[type="checkbox"]')
checkbox.addEventListener('change', function (e) {
  // detail 就是 CustomEvent 內的參數
  const clickEvent = new CustomEvent('check', {composed: true, detail: {check: this.checked}});
  self.dispatchEvent(clickEvent)
});
之後我們註冊 addEventListener('check' 到元素上 , 我們就可以看到事件的觸發
// 註冊範例 
document.querySelector('neuomorphic-button').addEventListener('check', e => console.log('註冊 & 監聽 check 事件 !!!', e.detail.check))

 EventTarget.addEventListener() 的部分已解決 , 接下來處理 <button oncheck="checkHandler(e)" /> 的部分
 處理 oncheck 屬性
const self = this
+ const oncheck = this.getAttribute('oncheck')
const checkbox = label.querySelector('input[type="checkbox"]')
checkbox.addEventListener('change', function (e) {
      ...之前的設定
      
+      eval(oncheck)
    });
之後我們註冊 oncheck="check(e)" 到元素上 , 我們就可以看到事件的觸發
// 註冊範例 
<neuomorphic-button icon="fas fa-lightbulb" oncheck="check(e)"></neuomorphic-button>
<script>
  function check(e) {
    console.log('oncheck 事件觸發 !!!', e)
  }
</script>


如果想直接體驗成果 , 請到 web-component-addEventListener.html 查看